A snoop request can be used to determine if a requested line already exists in an on-chip cache to avoid fetching the line from memory. A snoop filter may be implemented to help lessen the traffic to the cache(s) and improve memory performance. A snoop filter also may track the contents of the cache in order to avoid needlessly consuming cache bandwidth with requests for non-cached lines. In a multi-cache system, the first-level of cache accessed (e.g., the lowest level) by system instructions is generally the most sensitive to bandwidth concerns. A system snoop request of a lower-level cache may therefore utilize performance critical bandwidth when the cache is close to the instruction flow. Furthermore, although snoop requests successfully resolved by the snoop filter may require only minimal action at the associated cache(s), unresolved snoop requests are treated as a miss, and are then resolved by snooping the cache(s) associated with the respective snoop filter.
Coherence policies are typically used to track the state or ‘coherent status’ of lines in a cache. If the status of the cached line is known in the filter, whether clean or dirty, the filter may return a more meaningful response to the snoop request. One type of cache coherence protocol that may be implemented to track the status of the line in the cache is the Modified-Exclusive-Shared-Invalid (MESI) cache coherence protocol. Under the MESI protocol, a line is dirty if the line is modified. A line is clean if the line is exclusive or shared. Accessing a line in the system memory that is additionally in the cache, where the coherence state of the line in the cache is dirty because the line is shared or modified, may result in use of a stale line. Therefore, it is important to accurately maintain the coherence status of the cached lines so that dirty lines are not accessed in the system memory until they are written from the cache. While the MESI protocol is used here as an example, any other cache coherence protocol or model may be effectively implemented.
Efficiently maintaining coherence status in the snoop filter is not always easily accomplished. Traditional bus protocols do not often provide commands that may be used to manage coherence states. A read/write command is often used for cache coherency and cache management, but such commands take up unnecessary instruction bandwidth and are therefore inefficient and generally undesirable in many circumstances. Alternatively, most bus architectures provide a readonce command. The readonce acts as a latent read command that may be used to acquire a copy of a line without altering the state of the line. However, the readonce command consumes unnecessary data bandwidth by returning a copy of the read line. A more efficient method for updating the cache coherence may be desirable in some instances.
In multi-cache systems, a filter implemented with a cache coherency protocol may decrease the response time for snoop requests. However, if the snoop requests do not have identification tags, the filter can only respond to one request at a time. Therefore response time increases as the number of requests waiting for a response increases. The delay may be further exacerbated in a system having multiple requesting agents. Therefore, it may be desirable in some circumstances to implement a method and a system for handling multiple, simultaneous, non-tagged requests.